home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
dl_serie
/
updates
/
078
/
arj_996
/
mode_4.s
< prev
next >
Wrap
Text File
|
1995-11-25
|
4KB
|
120 lines
;
; ARJ mode4 decode function
; Size optimized
; (c) 1993 Mr Ni! (the Great) of the TOS-crew
;
; void decode_f(ulong origsize /* size of depacked data */,
; char* depack_space, char* packed_data)
; CALL:
; D0 = origsize (long) (size of depacked data)
; A0 = ptr to depack space
; A1 = ptr to packed data
;
; Register usage:
; d0: temporary register
; d1: temporary register
; d2: temporary register, pointer offset
; d3: bytes to do counter
; d4: #bytes to copy
; d5: klad
; d6: bitbuf,subbitbuf
; d7: #bits in subbitbuf
; a0: depack space
; a1: rbuf_current
; a2: source adres for byte copy
; a3: temporary register
; a4: not used
; a5: not used
; a6: not used
decode_f:
movem.l D3-D7/A2-A3,-(SP) ; save registers
move.l D0,D3 ; origsize
moveq #0,D7 ; bitcount = 0
move.w A1,D0 ; for checking rbuf_current
btst D7,D0 ; does readbuf_current point to an even address?
beq.s .cont ; yes
move.b (A1)+,D6 ; pop eight bits
moveq #8,D7 ; 8 bits in subbitbuf
lsl.w #8,D6 ;
.cont:
moveq #$10,D4 ; push 16 (8) bits into bitbuf
sub.w D7,D4 ; subtract still available bits from d5
lsl.l D7,D6 ;
move.w (A1)+,D6 ; word in subbitbuf
lsl.l D4,D6 ; fill bitbuf
.count_loop: ; main depack loop
move.l D6,D1 ; evaluate most significant bit bitbuf
bmi.s .start_sld ; =1 -> sliding dictionary
moveq #9,D0 ; pop bits from bitbuf for literal
bsr.s .getbits ;
move.b D2,(A0)+ ; push byte in buffer
.eval_loop:
subq.l #1,D3 ;
bne.s .count_loop ;
movem.l (SP)+,D3-D7/A2-A3 ;
rts ;
.start_sld: ; start decode len
movea.w #8,A3 ;
moveq #0,D2 ; max power
bsr.s .get_them ;
add.w D2,D5 ; length
move.w D5,D4 ;
move.l D6,D1 ; bitbuf
subq.w #3,A3 ; move.w #5,a3
moveq #9,D2 ; minimum getbits
bsr.s .get_them ;
ror.w #7,D5 ;
addq.w #1,D4 ; increment len by one
add.w D5,D2 ; calc pointer
neg.w D2 ; pointer offset negatief
lea -1(A0,D2.w),A2 ; pointer in dictionary
sub.l D4,D3 ; sub 'bytes to copy' from 'bytes to do' (d4 is 1 too less!)
.copy_loop_0:
move.b (A2)+,(A0)+ ;
dbra D4,.copy_loop_0 ;
bra.s .eval_loop ;
.get_them:
moveq #1,D0 ; minimum fillbits
moveq #0,D5 ; value
.loop:
add.l D1,D1 ; shift bit outside
bcc.s .einde ; if '1' end decode
addx.w D5,D5 ; value *2+1
addq.w #1,D0 ; extra fill
addq.w #1,D2 ; extra get
cmp.w A3,D0 ; max bits
bne.s .loop ; nog mal
subq.w #1,D0 ; 1 bit less to trash
.einde: ;
bsr.s .fillbits ; trash bits
move.w D2,D0 ; bits to get
bsr.s .getbits ; get bits
rts ;
.getbits:
move.l D6,D2 ;
clr.w D2 ;
rol.l D0,D2 ;
.fillbits:
sub.b D0,D7 ; decrease subbitbuf count
bcs.s .fill_subbitbuf ; not enough
rol.l D0,D6 ; bits to pop from buffer
rts ;
.fill_subbitbuf: ;
move.b D7,D1 ;
add.b D0,D1 ;
sub.b D1,D0 ;
rol.l D1,D6 ;
move.w (A1)+,D6 ;
rol.l D0,D6 ;
add.b #16,D7 ; bits in subbitbuf
rts
;d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4,a5,a6,a7,sp
********************************************************************************
END